const path = require('path')
const webpack = require('webpack')
const VueLoaderPlugin = require('vue-loader/lib/plugin')

const buildHelper = require('../build/helper')
// const BundleAnalyzerPlugin = require('webpack-bundle-analyzer').BundleAnalyzerPlugin;

//frontend编译目标目录
var distDir = path.resolve(__dirname, '..', 'static', 'js')

//清除原有js文件
// buildHelper.clear(distDir)

var config = {
    target: ['web', 'es5'],
    entry: {
        appPersonal: ['./frontend/libs/publicpath.js', './frontend/ts/personal/appPersonal.ts'],
    },
    output: {
        filename: '[name].min.js',
        path: distDir,
        publicPath: '/static/js/',
        chunkFilename: '[name].min.js?[chunkhash:8]',
        assetModuleFilename: 'img/[hash][ext]',
    },
    resolve: {
        extensions: ['.ts', '.js', '.vue'],
        alias: {
            'iview-style': 'iview/dist/styles/iview.css',
            "iview": path.join(__dirname, './libs/iview.min-2.14.3.js')
        }
    },
    cache: {
        type: "filesystem",
        buildDependencies: {
            config: [__filename],
        },
    },
    module: {
        rules: [
            {
                test: /\.css$/,
                use: ['style-loader', 'css-loader'],
            },
            {
                test: /\.less$/,
                use: ['style-loader', 'css-loader', 'less-loader'],
            },
            {
                test: /\.vue$/,
                loader: 'vue-loader'
            },
            {
                test: /\.ts$/,
                loader: 'ts-loader',
                exclude: file => /node_modules/.test(file) && !/\.vue(.ts)?$/.test(file),
                options: {
                    appendTsSuffixTo: [/\.vue$/],
                    transpileOnly: true,
                }
            },
            {
                test: /\.(png|jpg|gif|woff|woff2|svg|eot|ttf)$/i,
                type: 'asset',
                parser: {
                    dataUrlCondition: {
                        maxSize: 10 * 1024, // 10kb
                    },
                },
            }
        ]
    },
    optimization: {
        splitChunks: {
            chunks: 'all',
            minSize: 30000,
            minChunks: 1,
            maxAsyncRequests: 5,
            maxInitialRequests: 3,
            name: 'vendor',
            cacheGroups: {
                default: {
                    minChunks: 2,
                    priority: -20,
                    reuseExistingChunk: true
                },
                vendors: {
                    test: /[\\/]node_modules[\\/]/,
                    priority: -10
                }
            }
        }
    },
    plugins: [
        // new BundleAnalyzerPlugin({
        //     //  可以是`server`，`static`或`disabled`。
        //     //  在`server`模式下，分析器将启动HTTP服务器来显示软件包报告。
        //     //  在“静态”模式下，会生成带有报告的单个HTML文件。
        //     //  在`disabled`模式下，你可以使用这个插件来将`generateStatsFile`设置为`true`来生成Webpack Stats JSON文件。
        //     analyzerMode: 'server',
        //     //  将在“服务器”模式下使用的主机启动HTTP服务器。
        //     analyzerHost: '127.0.0.1',
        //     //  将在“服务器”模式下使用的端口启动HTTP服务器。
        //     analyzerPort: 8888,
        //     //  路径捆绑，将在`static`模式下生成的报告文件。
        //     //  相对于捆绑输出目录。
        //     reportFilename: 'report.html',
        //     //  模块大小默认显示在报告中。
        //     //  应该是`stat`，`parsed`或者`gzip`中的一个。
        //     //  有关更多信息，请参见“定义”一节。
        //     defaultSizes: 'parsed',
        //     //  在默认浏览器中自动打开报告
        //     openAnalyzer: true,
        //     //  如果为true，则Webpack Stats JSON文件将在bundle输出目录中生成
        //     generateStatsFile: false,
        //     //  如果`generateStatsFile`为`true`，将会生成Webpack Stats JSON文件的名字。
        //     //  相对于捆绑输出目录。
        //     statsFilename: 'stats.json',
        //     //  stats.toJson（）方法的选项。
        //     //  例如，您可以使用`source：false`选项排除统计文件中模块的来源。
        //     //  在这里查看更多选项：https：  //github.com/webpack/webpack/blob/webpack-1/lib/Stats.js#L21
        //     statsOptions: null,
        //     logLevel: 'info'
        //     // 日志级别。 可以是 '信息'，
        //     // '警告'，
        //     // '错误'
        //     // 或 '沉默'。
        // }),
        // new webpack.ContextReplacementPlugin(/moment[/\\]locale$/, /zh-cn/,), //moment只打包简体语言包
        //moment不打包语言包
        new webpack.IgnorePlugin({
            resourceRegExp: /^\.\/locale$/,
            contextRegExp: /moment$/,
        }),
        new VueLoaderPlugin(),
        /** 全局导入jQuery saveAs 供jquery.wordexport使用 */
        new webpack.ProvidePlugin({
            $: path.join(__dirname, './libs/wordExport/jquery-1.12.4.js'),
            'jQuery': path.join(__dirname, './libs/wordExport/jquery-1.12.4.js'),
            saveAs: 'file-saver'
        })
    ]
}

module.exports = env => {
    var isDebug = false
    config.mode = 'development'
    config.devtool = 'eval-cheap-module-source-map'
    if (env) {
        if (env.isDebug && env.isDebug === 'true') {
            isDebug = true
        }
    }

    if (!isDebug) {
        config.mode = 'production'
        config.devtool = false
    }

    return config
}
